using System;
using Gtk;
using NHibernate.Cfg;
using NHibernate;
using System.Collections;
using NHibernate.UserTypes;

namespace PNhibernate
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			Application.Init ();
			
			Configuration configuration = new Configuration();
			configuration.Configure();
			
			configuration.AddAssembly("PNhibernate");
			
			ISessionFactory sessionFactory = configuration.BuildSessionFactory();
			
			ISession session = sessionFactory.OpenSession();
			
			//	Cargamos un objeto Categoria
			Categoria categoria = session.Load<Categoria>(3L);			
			//	Lo visualizamos por consola
			Console.WriteLine("Id={0}, Nombre={1}", categoria.Id, categoria.Nombre);
			Console.WriteLine();
			//	Modificamos su 'Nombre'
			categoria.Nombre = "categoria tresss";
			//	Creamos un nuevo objeto Categoria
			Categoria cat_2 = new Categoria();
			//	Le asignamos nombre
			cat_2.Nombre = "categoria nueva";
			//	Guardamos los cambios realizados durante la sesión	
			session.Save(categoria);	// Guardamos categoria
			session.Save(cat_2);		// Guardamos cat_2
			session.Flush();
			//	Realizamos la consulta con el metodo CreateQuery de la clase session. NOTA: el metodo Find() no logro rularlo...
			//	La consulta, la hacemos con un criterio simple de busqueda, descartando algun registro
			IQuery queryCat = session.CreateQuery("from Categoria where id>2");
			IList listaCat = queryCat.List();
			//	Mostramos...
			foreach(Categoria cat in listaCat)
			{
				Console.WriteLine("{0} - {1}", cat.Id, cat.Nombre);
			}
			Console.WriteLine();
			//	Hacemos la consulta para Articulo NOTA: Acordemonos de embeber 'Articulo.hbm.xml'
			IQuery queryArt = session.CreateQuery("from Articulo");
			IList listaArt = queryArt.List();
			//	Mostramos todo...
			foreach(Articulo art in listaArt)
			{
				Console.WriteLine("{0}-{1}-{2}-{3}", art.Id, art.Nombre, art.Precio, art.Categoria);
			}
			//	Cerramos sesión y sessionFactory
			session.Close();
			sessionFactory.Close();
			
			
			MainWindow win = new MainWindow ();
			win.Show ();
			Application.Run ();
		}
	}
}
